<template>
	<view :class="keyboardStyle">
		<view class="digit-keyboard" v-if="mode === 'digit' || digital">
			<view class="digit-button-box">
				<template v-for="(digit, index) in digits">
					<view :key="index" class="key-button digit" @tap="typing(digit)">{{digit}}</view>
				</template>
				<view class="key-button digit">
					<i class="iconfont icon-shouqijianpan middle" v-if="digital" @tap="deactivate"></i>
					<i class="iconfont icon-ABC middle" v-else @tap="typingLetter"></i>
				</view>
			</view>
			<view class="special-button-box">
				<view class="key-button special-button gray" @tap="backspace"><i class="iconfont icon-backspace large"></i></view>
				<view class="key-button special-button gray" @tap="enter"><i class="iconfont icon-huiche large"></i></view>
			</view>
		</view>
		<view class="full-keyboard" v-else>
			<view class="line" v-for="(letters, index) in lines" :key="index">
				<view class="letter key-button special-key gray" v-if="index === 3 && mode === 'letter'" @tap="toggleCase"><i :class="'iconfont ' + (lowercase ? 'icon-xiaoxie' : 'icon-daxie')"></i></view>
				<view class="letter key-button normal" v-for="letter in letters" @tap="typing(letter)" :key="letter">{{letter}}</view>
				<view class="letter key-button special-key gray" v-if="index === 3" @tap="backspace"><i class="iconfont icon-backspace"></i></view>
			</view>
			<view class="line special-line">
				<view class="letter key-button swith-key gray">
					<i class="iconfont icon-fuhao" @tap="typingSymbol" v-if="mode === 'letter'"></i>
					<i class="iconfont icon-ABC" @tap="typingLetter" v-if="mode === 'symbol'"></i>
				</view>
				<view class="letter key-button space" @tap="typing(' ')"><text class="logo">Magician 安全键盘</text></view>
				<view class="letter key-button swith-key gray" @tap="typingDigit"><i class="iconfont icon-shuzi"></i></view>
				<view class="letter key-button swith-key gray" @tap="enter"><i class="iconfont icon-huiche"></i></view>
			</view>
		</view>
	</view>
</template>

<script>
	import './css.scss'
	import { natural, order, disorder, symbols, digits, KEYBOARD_MODE } from './utils'
	export default {
		props: {
			//是否为纯数字键盘
			digital: {
				type: [ Boolean, String ],
				default: false
			},
			//是否无序的排序键盘
			disorderly: {
				type: [ Boolean, String ],
				default: false
			}/* ,
			value: String */
		},
		//app中不生效，不知道为什么
		/* model: {
			prop: 'value',
			event: 'typing'
		}, */
		computed: {
			keyboardStyle() {
				return 'v-keyboard ' + this.cls;
			}
		},
		data() {
			return {
				cls: '',							
				visible: false,					//是否显示
				digits: [],						//自然数数组
				lines: [],						//字母+数字数组
				lowercase: true,				//是否小写输入状态
				mode: KEYBOARD_MODE.LETTER,		//键盘模式
				keys: []						//键入的键值
			}
		},
		methods: {
			//大小写转换
			toggleCase() {
				this.lowercase = !this.lowercase;
			},
			//输入符号
			typingSymbol() {
				this.mode = KEYBOARD_MODE.SYMBOL;
				this.lines = symbols;
			},
			//输入字母
			typingLetter() {
				this.mode = KEYBOARD_MODE.LETTER;
				this.lines = this.disorderly ? disorder() : order;
			},
			//键入数字
			typingDigit() {
				this.mode = KEYBOARD_MODE.DIGIT;
			},
			//键盘键入
			typing(input) {
				this.keys.push(input);
				//app中v-model不生效，改用事件方式在外处理
				//this.$emit('typing', this.keys.join(''));
				
				this.$emit('typing', {
					backspace: false,
					char: input
				})
			},
			//退格键
			backspace() {
				if (this.keys.length) {
					this.keys.pop()
				}
				//this.$emit('typing', this.keys.join(''));
				this.$emit('typing', {
					backspace: true
				})
			},
			//键入回车
			enter() {
				//this.deactivate();
				this.$emit('enter');
			},
			//激活键盘
			activate() {
				// #ifdef APP-PLUS
				plus.key.hideSoftKeybord();
				// #endif
				this.visible = true;
			},
			//隐藏键盘
			deactivate() {
				this.visible = false;
			}
		},
		watch: {
			lowercase(val) {
				let [...temp ] = this.lines;
				temp.forEach(line => {
					line.forEach((letter, index) => {
						line[index] = val ? letter.toLowerCase() : letter.toUpperCase();
					});
				});
				this.lines = temp;
			},
			visible(val) {
				this.cls = val ? 'slideup' : 'slidedown';
			}
		},
		created() {
			this.lines = this.disorderly ? disorder() : order;
			this.digits = this.disorderly ? digits() : natural;
		}
	}
</script>

<style lang="scss" scoped>
	.key-button {
		display: inline-block;
		overflow: hidden;
		vertical-align: middle;
		border: 1px solid #e6e6e6;
		color: #333;
		background-color: #fff;
		box-shadow: 0 2px 2px rgba(230,230,230,.7);
		border-radius: 0.35em;
		text-align: center;
		white-space: nowrap;
		user-select: none;
		cursor: pointer;
		
		&:active {
			background: #d6d6d6;
			scale: 0.7;
		}
	}
	
	.v-keyboard {
		transform: translateY(100%);
		width: 100%;
		position: absolute;
		bottom: 0;
		left: 0;
		background: #f5f5f5;
		padding: .5em 0;
		z-index: 100;
		
		/*全键盘*/
		.full-keyboard {
			.line {
				text-align: center;
				
				&:not(:last-child) {
					margin-bottom: 0.5em;
				}
				
				.letter {
					height: 1.7em;
					line-height: 1.7em;
					font-size: 1em;
					
					&:not(:last-child) {
						margin-right: 0.2em;
					}
				}
				
				.normal {
					width: 1.65em;
				}
				
				.special-key {
					width: 2.6em;
				}
			}
				
			.special-line {
				padding: 0 0.35em;
				display: flex!important;
				justify-content: space-around;
				
				.space {
					flex: 1;
					display: flex;
					align-items: center;
					justify-content: center;
				}
				
				.swith-key {
					width: 2.6em;
				}
				
				.logo {
					font-size: 12px;
				}
			}
		}
		
		/*数字键盘*/
		.digit-keyboard {
			display: flex;
			flex-direction: row;
			.digit-button-box {
				padding: 0 .35em;
				flex: 80;
				.digit {
					width: 4.46em;
					height: 2.5em;
					line-height: 2.5em;
					margin-bottom: .35em;
					&:nth-child(10),
					&:nth-child(11),
					&:nth-child(12) {
						margin-bottom: 0;
					}
					&:not(:last-child) {
						margin-right: .35em;
					}
				}
			}
			
			.special-button-box {
				flex: 20;
				padding: 0 .35em 0 0;
				.special-button {
					display: block;
					line-height: 5.5em;
					height: 5.5em;
					width: 4em;
					&:not(:last-child) {
						margin-bottom: .35em;
					}
				}
			}
		}
		
		.gray {
			background: #e1e1e1!important;
			&:active {
				background: #fff!important;
			}
		}
		
		.large {
			font-size: 2em!important;
		}
		
		.middle {
			font-size: 1.2em!important;
			display: block;
		}
	}
</style>
